/**
 * 检查记住登录状态是否过期
 * @returns {Boolean} 如果未过期返回true，否则返回false并清除相关本地存储
 */
function checkRememberExpired(){
    const expire = localStorage.getItem('expireTime')
    if (expire){
        const now = new Date().getTime()
        if (now > parseInt(expire)){
            localStorage.removeItem("saveAccount");
            localStorage.removeItem("savePass");
            localStorage.removeItem("rememberMe");
            localStorage.removeItem("expireTime");
            return false;
        }
        return true;
    }
    return false;
}

/**
 * 路由守卫处理登录验证和自动登录逻辑
 * 在每次路由跳转前检查用户登录状态，并根据情况执行相应操作
 */
router.beforeEach((to, from, next) => {
    const isLoggedIn = localStorage.getItem('pass')
    if (to.path === '/login'){
        // 访问登录页时检查记住登录状态是否过期
        checkRemenmberExpired();
        if (isLoggedIn){
            // 已登录则重定向到首页
            next('/')
        }else {
            // 未登录则允许访问登录页
            next()
        }
    }else {
        // 访问非登录页时检查登录状态
        if (!isLoggedIn){
            // 尝试通过记住的账号信息自动登录
            if (checkRemenmberExpired()){
                const saveAccount = localStorage.getItem('saveAccount');
                const savePass = localStorage.getItem('savePass');
                if (saveAccount && savePass){
                    localStorage.setItem('pass', savePass)
                    localStorage.setItem('account', saveAccount)
                    store.dispatch('getrouterList')
                    next();
                     return;
                }
            }
            // 自动登录失败则重定向到登录页
            next('/login')
        }else {
            // 已登录则获取路由列表并继续导航
            store.dispatch('getrouterList')
            next()
        }
    }
})

/**
 * 打开一个居中显示的新窗口，并为其添加拖拽功能
 * @param {String} url - 新窗口要加载的URL地址
 * @param {String} title - 新窗口的标题
 * @param {Number} w - 新窗口的宽度
 * @param {Number} h - 新窗口的高度
 * @returns {Window} 返回新创建的窗口对象
 */
export default function openWindow(url, title, w, h) {
  // 计算双屏显示器下的屏幕位置偏移量，兼容不同浏览器
  const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left
  const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top

  // 获取当前窗口或屏幕的可用宽度和高度
  const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width
  const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height

  // 计算新窗口在屏幕中央的位置坐标
  const left = ((width / 2) - (w / 2)) + dualScreenLeft
  const top = ((height / 2) - (h / 2)) + dualScreenTop

  // 创建新窗口并设置窗口属性
  const newWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left)

  // 设置新窗口获得焦点
  if (window.focus) {
    newWindow.focus()
  }

  // 窗口加载完成后添加拖拽功能
  newWindow.addEventListener('load',function (){
      const doc = newWindow.document;
      let isDragging = false;
      let currentX, currentY, initialX, initialY, xOffset = 0, yOffset = 0;

      // 设置鼠标样式和禁用文本选择以支持拖拽
      doc.body.style.cursor = 'move';
      doc.body.style.userSelect = 'none';

      // 添加鼠标事件监听器实现拖拽功能
      doc.body.addEventListener('mousedown', dragStart, false);
      doc.body.addEventListener('mouseup', dragEnd, false);
      doc.body.addEventListener('mousemove', drag, false);

      /**
       * 拖拽开始事件处理函数
       * @param {MouseEvent} e - 鼠标事件对象
       */
      function dragStart(e) {
          initialX = e.clientX - xOffset;
          initialY = e.clientY - yOffset;
          if (e.target === doc.body){
              isDragging = true;
          }
      }

      /**
       * 拖拽结束事件处理函数
       * @param {MouseEvent} e - 鼠标事件对象
       */
      function dragEnd(e){
          initialX = currentX;
          initialY = currentY;
          isDragging = false;
      }

      /**
       * 拖拽过程中事件处理函数
       * @param {MouseEvent} e - 鼠标事件对象
       */
      function drag(e) {
          if (isDragging){
              e.preventDefault();
              currentX = e.clientX - initialX;
              currentY = e.clientY - initialY;

              xOffset = currentX;
              yOffset = currentY;

              setTranslate(currentX, currentY, doc.body);
          }
      }

      /**
       * 设置元素的3D变换位置
       * @param {Number} xPos - X轴偏移量
       * @param {Number} yPos - Y轴偏移量
       * @param {HTMLElement} el - 要变换的HTML元素
       */
      function setTranslate(xPos, yPos, el) {
          el.style.transform = "translate3d(" + xPos + "px, " + yPos + "px, 0)";
      }
  });
  return newWindow;
}
